﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Week5Tasks
{
    class Program
    {
        // 用于存储用户信息的字典
        static Dictionary<string, string> users = new Dictionary<string, string>();

        static void Main(string[] args)
        {
            bool exitProgram = false;
            
            while (!exitProgram)
            {
                Console.Clear();
                Console.WriteLine("===== 第五周任务集合 =====");
                Console.WriteLine("1. 三个整数排序");
                Console.WriteLine("2. 1-100特殊数字求和");
                Console.WriteLine("3. 打印九九乘法表");
                Console.WriteLine("4. 找出1000以内的完数");
                Console.WriteLine("5. 数字位数及逆序");
                Console.WriteLine("6. 打印菱形");
                Console.WriteLine("7. 用户登录与注册");
                Console.WriteLine("0. 退出程序");
                Console.WriteLine("======================");
                Console.Write("请选择任务(0-7): ");
                
                string choice = Console.ReadLine();
                switch (choice)
                {
                    case "1":
                        Task1();
                        break;
                    case "2":
                        Task2();
                        break;
                    case "3":
                        Task3();
                        break;
                    case "4":
                        Task4();
                        break;
                    case "5":
                        Task5();
                        break;
                    case "6":
                        Task6();
                        break;
                    case "7":
                        UserAuthMenu();
                        break;
                    case "0":
                        exitProgram = true;
                        break;
                    default:
                        Console.WriteLine("无效选择，请重新输入！");
                        break;
                }
                
                if (!exitProgram && choice != "0")
                {
                    Console.WriteLine("\n按任意键返回主菜单...");
                    Console.ReadKey();
                }
            }
            
            Console.WriteLine("程序已退出，谢谢使用！");
        }

        // 任务1：三个整数由小到大输出
        static void Task1()
        {
            Console.WriteLine("\n===== 三个整数排序 =====");
            
            try
            {
                Console.Write("请输入第一个整数x: ");
                int x = int.Parse(Console.ReadLine());
                
                Console.Write("请输入第二个整数y: ");
                int y = int.Parse(Console.ReadLine());
                
                Console.Write("请输入第三个整数z: ");
                int z = int.Parse(Console.ReadLine());
                
                // 排序
                int[] numbers = { x, y, z };
                Array.Sort(numbers);
                
                Console.WriteLine($"由小到大排序结果: {numbers[0]} < {numbers[1]} < {numbers[2]}");
            }
            catch (FormatException)
            {
                Console.WriteLine("输入格式错误，请输入有效的整数！");
            }
        }

        // 任务2：1-100之间所有不是7的倍数和不包含7的数字，并求和
        static void Task2()
        {
            Console.WriteLine("\n===== 1-100特殊数字求和 =====");
            
            int sum = 0;
            Console.WriteLine("符合条件的数字:");
            
            for (int i = 1; i <= 100; i++)
            {
                // 检查是否是7的倍数或包含7
                if (i % 7 != 0 && !i.ToString().Contains("7"))
                {
                    Console.Write(i + " ");
                    sum += i;
                    
                    // 每行显示10个数字
                    if (i % 10 == 0)
                        Console.WriteLine();
                }
            }
            
            Console.WriteLine($"\n\n这些数字的和为: {sum}");
        }

        // 任务3：打印九九乘法表
        static void Task3()
        {
            Console.WriteLine("\n===== 九九乘法表 =====");
            
            for (int i = 1; i <= 9; i++)
            {
                for (int j = 1; j <= i; j++)
                {
                    Console.Write($"{j}×{i}={i*j}\t");
                }
                Console.WriteLine();
            }
        }

        // 任务4：求出1000以内的所有完数
        static void Task4()
        {
            Console.WriteLine("\n===== 1000以内的完数 =====");
            
            for (int num = 2; num <= 1000; num++)
            {
                int sum = 1; // 1是所有大于1的数的真因子
                
                // 查找所有真因子
                for (int i = 2; i <= num / 2; i++)
                {
                    if (num % i == 0)
                    {
                        sum += i;
                    }
                }
                
                // 判断是否为完数
                if (sum == num)
                {
                    Console.Write($"{num}的真因子有: 1");
                    
                    // 再次查找因子以显示
                    for (int i = 2; i <= num / 2; i++)
                    {
                        if (num % i == 0)
                        {
                            Console.Write($", {i}");
                        }
                    }
                    Console.WriteLine($"，和为{sum}");
                }
            }
        }

        // 任务5：数字位数及逆序
        static void Task5()
        {
            Console.WriteLine("\n===== 数字位数及逆序 =====");
            
            try
            {
                Console.Write("请输入一个正整数: ");
                string input = Console.ReadLine();
                
                // 验证输入是否为正整数
                if (!int.TryParse(input, out int number) || number <= 0)
                {
                    Console.WriteLine("请输入有效的正整数！");
                    return;
                }
                
                // 计算位数
                int digitCount = input.Length;
                Console.WriteLine($"这是一个{digitCount}位数");
                
                // 逆序打印
                char[] digits = input.ToCharArray();
                Array.Reverse(digits);
                string reversed = new string(digits);
                Console.WriteLine($"逆序打印: {reversed}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"输入错误: {ex.Message}");
            }
        }

        // 任务6：打印菱形
        static void Task6()
        {
            Console.WriteLine("\n===== 打印菱形 =====");
            
            try
            {
                Console.Write("请输入菱形的行数(奇数): ");
                int rows = int.Parse(Console.ReadLine());
                
                // 确保输入是奇数
                if (rows % 2 == 0)
                {
                    Console.WriteLine("请输入奇数！已自动调整为" + (rows + 1));
                    rows++;
                }
                
                int half = rows / 2;
                
                // 上半部分（包括中间行）
                for (int i = 0; i <= half; i++)
                {
                    // 打印空格
                    for (int j = 0; j < half - i; j++)
                    {
                        Console.Write(" ");
                    }
                    
                    // 打印星号
                    for (int k = 0; k < 2 * i + 1; k++)
                    {
                        Console.Write("*");
                    }
                    
                    Console.WriteLine();
                }
                
                // 下半部分
                for (int i = half - 1; i >= 0; i--)
                {
                    // 打印空格
                    for (int j = 0; j < half - i; j++)
                    {
                        Console.Write(" ");
                    }
                    
                    // 打印星号
                    for (int k = 0; k < 2 * i + 1; k++)
                    {
                        Console.Write("*");
                    }
                    
                    Console.WriteLine();
                }
            }
            catch (FormatException)
            {
                Console.WriteLine("请输入有效的整数！");
            }
        }

        // 任务7：用户登录与注册 - 主菜单
        static void UserAuthMenu()
        {
            bool backToMain = false;
            
            while (!backToMain)
            {
                Console.Clear();
                Console.WriteLine("===== 用户登录与注册 =====");
                Console.WriteLine("1. 登录");
                Console.WriteLine("2. 注册");
                Console.WriteLine("3. 返回主菜单");
                Console.Write("请选择: ");
                
                string choice = Console.ReadLine();
                
                switch (choice)
                {
                    case "1":
                        Login();
                        break;
                    case "2":
                        Register();
                        break;
                    case "3":
                        backToMain = true;
                        break;
                    default:
                        Console.WriteLine("请输入有效数字(1-3)！");
                        Console.WriteLine("按任意键继续...");
                        Console.ReadKey();
                        break;
                }
            }
        }

        // 用户注册
        static void Register()
        {
            Console.WriteLine("\n===== 用户注册 =====");
            
            // 获取用户名
            string username;
            while (true)
            {
                Console.Write("请输入用户名: ");
                username = Console.ReadLine()?.Trim();
                
                // 检查是否为空
                if (string.IsNullOrEmpty(username))
                {
                    Console.WriteLine("用户名不可为空！");
                    continue;
                }
                
                // 检查长度
                if (username.Length < 3 || username.Length > 15)
                {
                    Console.WriteLine("用户名长度必须为3-15个字符！");
                    continue;
                }
                
                // 检查格式（只能包含字母、数字、下划线）
                if (!Regex.IsMatch(username, @"^[a-zA-Z0-9_]+$"))
                {
                    Console.WriteLine("用户名只能包含字母、数字和下划线！");
                    continue;
                }
                
                // 检查用户名是否已存在
                if (users.ContainsKey(username))
                {
                    Console.WriteLine("用户名已存在，请选择其他用户名！");
                    continue;
                }
                
                break; // 所有验证通过
            }
            
            // 获取密码
            string password;
            while (true)
            {
                Console.Write("请输入密码: ");
                password = ReadPassword(); // 使用自定义方法读取密码，不显示输入内容
                
                // 检查是否为空
                if (string.IsNullOrEmpty(password))
                {
                    Console.WriteLine("密码不可为空！");
                    continue;
                }
                
                // 检查长度
                if (password.Length < 6 || password.Length > 20)
                {
                    Console.WriteLine("密码长度必须为6-20个字符！");
                    continue;
                }
                
                // 检查是否包含至少1个大写字母、1个小写字母和1个数字
                bool hasUpper = password.Any(char.IsUpper);
                bool hasLower = password.Any(char.IsLower);
                bool hasDigit = password.Any(char.IsDigit);
                
                if (!hasUpper || !hasLower || !hasDigit)
                {
                    Console.WriteLine("密码必须包含至少1个大写字母、1个小写字母和1个数字！");
                    continue;
                }
                
                break; // 所有验证通过
            }
            
            // 确认密码
            while (true)
            {
                Console.Write("请确认密码: ");
                string confirmPassword = ReadPassword();
                
                if (password != confirmPassword)
                {
                    Console.WriteLine("两次输入的密码不一致，请重新输入！");
                    continue;
                }
                
                break;
            }
            
            // 注册成功，保存用户信息
            users.Add(username, password);
            Console.WriteLine("注册成功！");
            Console.WriteLine("按任意键返回...");
            Console.ReadKey();
        }

        // 用户登录
        static void Login()
        {
            Console.WriteLine("\n===== 用户登录 =====");
            
            Console.Write("请输入用户名: ");
            string username = Console.ReadLine()?.Trim();
            
            // 检查用户名是否存在
            if (!users.ContainsKey(username))
            {
                Console.WriteLine("用户名不存在！");
                Console.WriteLine("按任意键返回...");
                Console.ReadKey();
                return;
            }
            
            Console.Write("请输入密码: ");
            string password = ReadPassword();
            
            // 验证密码
            if (users[username] == password)
            {
                Console.WriteLine("\n登录成功！欢迎进入系统首页！");
                Console.WriteLine("按任意键返回...");
                Console.ReadKey();
            }
            else
            {
                Console.WriteLine("\n密码错误！");
                Console.WriteLine("按任意键返回...");
                Console.ReadKey();
            }
        }

        // 读取密码（不显示输入内容）
        static string ReadPassword()
        {
            string password = "";
            ConsoleKeyInfo key;
            
            do
            {
                key = Console.ReadKey(true);
                
                // 处理退格键
                if (key.Key == ConsoleKey.Backspace && password.Length > 0)
                {
                    password = password.Substring(0, password.Length - 1);
                    Console.Write("\b \b"); // 删除屏幕上的最后一个字符
                }
                // 处理回车键
                else if (key.Key != ConsoleKey.Enter)
                {
                    password += key.KeyChar;
                    Console.Write("*"); // 显示星号代替实际字符
                }
            } while (key.Key != ConsoleKey.Enter);
            
            Console.WriteLine(); // 换行
            return password;
        }
    }
}
